myreg <- c("LANGUEDOC-ROUSSILLON-MIDI-PYRENEES")Classification/Régionalisation
Application aux résultats des élections européennes de 2024 en France
- Mise en place : Télécharger le dossier exo_autocor.zip et décompressez le sur votre ordinateur. Puis créez un projet R avant d’executer le programme
Vous allez choisir une ou plusieurs régions voisines hors Ile-de-France (données imparfaites pour Paris)
“ALSACE-CHAMPAGNE-ARDENNE-LORRAINE”
“AQUITAINE-LIMOUSIN-POITOU-CHARENTES” “AUVERGNE-RHONE-ALPES”
“BOURGOGNE-FRANCHE-COMTE”
“BRETAGNE”
“CENTRE-VAL DE LOIRE”
“LANGUEDOC-ROUSSILLON-MIDI-PYRENEES” “NORD-PAS-DE-CALAIS-PICARDIE”
“NORMANDIE”
“PAYS DE LA LOIRE”
“PROVENCE-ALPES-COTE D’AZUR”
Recopiez leurs noms ci-dessous :
A. CLASSIFCATION A L’ECHELLE REGIONALE
On commence par des méthodes statistiques classiques (ACP et CAH) afin de situer notre région par rapport aux autres, de voir quels partis y sont les plus importants ou les plus faibles, et de voir quelles sont les régions qui lui ressemblent le plus ou le moins.
- N.B. On a choisi d’utiliser une ACP sur variables standardisées, ce qui donne le même poids à tous les partis. On aurait pu évidemment faire un choix différent…
Tableau de données
### Données
don<-readRDS("data/elect2024/don_reg.RDS")
code<-as.factor(don$nom_reg)
levels(code)<-c("ACAL", "AQUI","AURA","BOFC","BRET","CVDL","IDF","OCCI","NOPI","NORM","PDL","PACA")
tab<-as.matrix(don[,3:12])
rownames(tab)<-code
kable(tab, digits=1, caption = "Résultats des européeennes 2024 par région")| Aubry | Bardella | Bellamy | Deffontaines | Glucksman | Hayer | Lassale | Marechal | Toussaint | Autres | |
|---|---|---|---|---|---|---|---|---|---|---|
| ACAL | 7.6 | 38.3 | 7.6 | 1.6 | 10.8 | 14.4 | 1.9 | 5.5 | 4.1 | 8.2 |
| AQUI | 6.8 | 30.9 | 6.5 | 2.9 | 16.0 | 14.8 | 4.7 | 5.0 | 5.3 | 7.2 |
| AURA | 9.5 | 30.9 | 8.0 | 2.3 | 13.8 | 14.2 | 2.1 | 5.6 | 6.2 | 7.4 |
| BOFC | 7.0 | 37.1 | 7.5 | 2.3 | 12.2 | 13.8 | 2.9 | 5.3 | 4.4 | 7.6 |
| BRET | 7.1 | 25.6 | 7.5 | 2.6 | 18.4 | 17.4 | 2.3 | 4.2 | 7.3 | 7.6 |
| CVDL | 7.4 | 34.9 | 7.5 | 2.6 | 12.5 | 15.1 | 2.6 | 5.4 | 4.4 | 7.5 |
| IDF | 18.6 | 18.8 | 8.8 | 2.0 | 15.8 | 15.5 | 0.8 | 5.7 | 7.0 | 7.1 |
| OCCI | 9.0 | 33.7 | 5.5 | 2.7 | 15.5 | 12.2 | 3.8 | 5.5 | 5.1 | 7.0 |
| NOPI | 8.4 | 42.4 | 6.1 | 3.1 | 9.0 | 12.9 | 2.5 | 4.6 | 3.6 | 7.4 |
| NORM | 6.9 | 35.3 | 6.9 | 2.8 | 13.3 | 15.7 | 2.7 | 4.6 | 4.4 | 7.3 |
| PDL | 7.1 | 27.6 | 7.9 | 2.1 | 16.1 | 17.9 | 2.1 | 4.7 | 7.1 | 7.3 |
| PACA | 9.7 | 38.6 | 6.4 | 2.1 | 10.5 | 12.3 | 1.5 | 7.7 | 4.2 | 6.9 |
Analyse en composantes principales
On utilise la procédure PCA de FactoMineR que la plupart des étudiants connaissent :
acp<-PCA(tab, scale.unit = T)summary(acp)
Call:
PCA(X = tab, scale.unit = T)
Eigenvalues
Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7
Variance 4.197 2.616 1.854 0.615 0.380 0.180 0.088
% of var. 41.969 26.158 18.538 6.152 3.805 1.799 0.883
Cumulative % of var. 41.969 68.127 86.665 92.817 96.622 98.421 99.303
Dim.8 Dim.9 Dim.10
Variance 0.051 0.018 0.000
% of var. 0.512 0.185 0.000
Cumulative % of var. 99.815 100.000 100.000
Individuals (the 10 first)
Dist Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3
ACAL | 3.751 | -0.631 0.790 0.028 | -1.970 12.365 0.276 | 2.932
AQUI | 2.966 | -0.673 0.899 0.051 | 2.506 20.001 0.714 | -1.003
AURA | 1.378 | 0.911 1.648 0.437 | -0.631 1.267 0.209 | -0.075
BOFC | 1.637 | -0.989 1.943 0.365 | -0.325 0.337 0.039 | 1.002
BRET | 3.507 | 2.648 13.928 0.570 | 2.033 13.161 0.336 | 0.680
CVDL | 1.176 | -0.579 0.666 0.242 | 0.013 0.001 0.000 | 0.697
IDF | 5.120 | 4.138 34.003 0.653 | -2.230 15.836 0.190 | -1.610
OCCI | 3.134 | -1.618 5.199 0.267 | 1.111 3.930 0.126 | -2.107
NOPI | 3.620 | -3.037 18.310 0.704 | 0.276 0.242 0.006 | 0.332
NORM | 1.805 | -0.731 1.062 0.164 | 1.196 4.559 0.439 | 0.236
ctr cos2
ACAL 38.653 0.611 |
AQUI 4.526 0.114 |
AURA 0.025 0.003 |
BOFC 4.510 0.375 |
BRET 2.081 0.038 |
CVDL 2.181 0.351 |
IDF 11.648 0.099 |
OCCI 19.947 0.452 |
NOPI 0.495 0.008 |
NORM 0.250 0.017 |
Variables
Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr
Aubry | 0.483 5.561 0.233 | -0.561 12.032 0.315 | -0.487 12.805
Bardella | -0.938 20.984 0.881 | -0.113 0.486 0.013 | 0.293 4.631
Bellamy | 0.818 15.932 0.669 | -0.326 4.062 0.106 | 0.336 6.086
Deffontaines | -0.414 4.082 0.171 | 0.728 20.278 0.530 | -0.300 4.862
Glucksman | 0.734 12.835 0.539 | 0.547 11.432 0.299 | -0.263 3.744
Hayer | 0.771 14.152 0.594 | 0.377 5.424 0.142 | 0.369 7.328
Lassale | -0.453 4.882 0.205 | 0.762 22.212 0.581 | -0.141 1.077
Marechal | -0.248 1.470 0.062 | -0.759 22.019 0.576 | -0.417 9.363
Toussaint | 0.918 20.091 0.843 | 0.218 1.810 0.047 | -0.183 1.799
Autres | 0.022 0.012 0.000 | -0.080 0.244 0.006 | 0.946 48.306
cos2
Aubry 0.237 |
Bardella 0.086 |
Bellamy 0.113 |
Deffontaines 0.090 |
Glucksman 0.069 |
Hayer 0.136 |
Lassale 0.020 |
Marechal 0.174 |
Toussaint 0.033 |
Autres 0.896 |
- Commentaires :
- L’axe 1 résume … % de l’information et oppose les régons … aux régions …
- L’axe 2 résume … % de l’information et oppose les régons … aux régions …
- La position de notre région dans le plan factoriel montre …
Classification ascendante hiérarchique
Vous allez ensuite classer les régions en choisissant le nombre de classes adapté (ici 2)
cah<-HCPC(acp, nb.clust = 2, graph=F)
plot(cah,choice = "tree")catdes(cah$data.clust,num.var = 11)
Link between the cluster variable and the quantitative variables
================================================================
Eta2 P-value
Toussaint 0.8488306 2.078509e-05
Bardella 0.6496145 1.547239e-03
Bellamy 0.4853048 1.182744e-02
Hayer 0.4123888 2.434807e-02
Glucksman 0.3982128 2.777675e-02
Description of each cluster by quantitative variables
=====================================================
$`1`
v.test Mean in category Overall mean sd in category Overall sd
Bardella 2.673155 36.421230 32.856784 3.2746565 6.2543056
Glucksman -2.092926 12.479180 13.668880 2.2551663 2.6662135
Hayer -2.129854 13.884500 14.674870 1.2455553 1.7405712
Bellamy -2.310487 6.736277 7.178515 0.7116798 0.8977669
Toussaint -3.055673 4.460683 5.271143 0.5157216 1.2440455
p.value
Bardella 0.007514144
Glucksman 0.036355724
Hayer 0.033183685
Bellamy 0.020861182
Toussaint 0.002245561
$`2`
v.test Mean in category Overall mean sd in category Overall sd
Toussaint 3.055673 6.892064 5.271143 0.4122303 1.2440455
Bellamy 2.310487 8.062990 7.178515 0.4811800 0.8977669
Hayer 2.129854 16.255609 14.674870 1.4959422 1.7405712
Glucksman 2.092926 16.048281 13.668880 1.6316290 2.6662135
Bardella -2.673155 25.727894 32.856784 4.4351597 6.2543056
p.value
Toussaint 0.002245561
Bellamy 0.020861182
Hayer 0.033183685
Glucksman 0.036355724
Bardella 0.007514144
- Commentaire : La classification met en évidence deux grands types de région.
- La classe 1 ( …) correspond à des régions qui ont significativement plus voté pour la.les listes … et moins voté pour la.les listes …
- La classe 2 (…) correspond à des régions qui ont significativement plus voté pour la.les listes … et moins voté pour la.les listes …
- notre région appartient à la classe …
Classification ascendante hiérarchique
cah<-HCPC(acp, nb.clust = 4, graph=F)
plot(cah,choice = "tree")catdes(cah$data.clust,num.var = 11)
Link between the cluster variable and the quantitative variables
================================================================
Eta2 P-value
Aubry 0.9124509 0.0001394206
Lassale 0.8415963 0.0014477425
Bardella 0.8222734 0.0022737740
Toussaint 0.7840109 0.0048701089
Glucksman 0.7619830 0.0071046385
Hayer 0.6672698 0.0258211127
Bellamy 0.6437010 0.0335083603
Description of each cluster by quantitative variables
=====================================================
$`1`
v.test Mean in category Overall mean sd in category Overall sd
Lassale 2.693611 4.244989 2.479399 0.4051319 0.9722238
Bellamy -1.972241 5.984768 7.178515 0.5017091 0.8977669
p.value
Lassale 0.007068261
Bellamy 0.048582150
$`2`
v.test Mean in category Overall mean sd in category Overall sd
Bardella 2.479272 36.808111 32.856784 3.3283332 6.254306
Toussaint -2.458332 4.491822 5.271143 0.7542412 1.244045
Glucksman -2.830897 11.745529 13.668880 1.5835472 2.666213
p.value
Bardella 0.013165079
Toussaint 0.013958414
Glucksman 0.004641762
$`3`
v.test Mean in category Overall mean sd in category Overall sd
Hayer 2.550464 17.667821 14.674870 0.25732059 1.740571
Toussaint 2.293669 7.194924 5.271143 0.08772127 1.244045
Glucksman 2.012458 17.286396 13.668880 1.15061744 2.666213
p.value
Hayer 0.01075797
Toussaint 0.02180951
Glucksman 0.04417165
$`4`
v.test Mean in category Overall mean sd in category Overall sd
Aubry 3.144405 18.56756 8.75000 0 3.122231
Bardella -2.249315 18.78888 32.85678 0 6.254306
p.value
Aubry 0.001664248
Bardella 0.024492492
- Commentaire : Ma région …
B. CLASSIFICATION A L’ECHELLE DEPARTEMENTALE
Nous allons maintenant reprendre l’analyse de la France entière mais au niveau des départements afin de savoir si notre région forme un ensemble homogène ou si les départements qui la compose font partie de classes différentes.
Préparation des données
On effectue cette fois-ci une jointure entre les données départementales et le fonds de carte correspondant afin de pouvoir produire des cartes.
### Fonds de carte région (pour habillage)
mapreg<-st_read("data/elect2024/map_reg.shp", quiet=T) %>%
st_transform(2154)
### Fonds de carte dept
map<-st_read("data/elect2024/map_dept.shp", quiet=T) %>%
select(code=code_dpt, geometry) %>%
st_transform(2154)
### Données
don<-readRDS("data/elect2024/don_dept.RDS") %>%
select(code=code_dpt, nom=nom_dpt, 5:14)
### Jointure
mapdon<-left_join(map[,1],don)Cartographie rapide
On visualise rapidement les scores de chaque parti pour avoir une idée de leur répartition. Il est évidemment possible de faire des cartes plus belles !
plot(mapdon[4:13])Analyse en composantes principales
On utilise la même procédure que pour les régions
tab<-mapdon[,4:13] %>% st_drop_geometry()
row.names(tab)<- mapdon$code
acp<-PCA(tab, scale.unit = T)summary(acp)
Call:
PCA(X = tab, scale.unit = T)
Eigenvalues
Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7
Variance 3.270 2.240 1.496 1.060 0.745 0.483 0.372
% of var. 32.696 22.401 14.962 10.604 7.452 4.827 3.723
Cumulative % of var. 32.696 55.097 70.060 80.664 88.115 92.943 96.666
Dim.8 Dim.9 Dim.10
Variance 0.261 0.073 0.000
% of var. 2.607 0.728 0.000
Cumulative % of var. 99.272 100.000 100.000
Individuals (the 10 first)
Dist Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3
01 | 1.707 | -0.150 0.007 0.008 | -1.602 1.219 0.880 | 0.310
02 | 3.793 | -3.324 3.594 0.768 | -0.814 0.314 0.046 | -0.023
03 | 3.855 | -1.729 0.972 0.201 | 1.607 1.227 0.174 | 0.752
04 | 2.263 | -0.859 0.240 0.144 | 0.563 0.150 0.062 | -1.460
05 | 2.129 | 1.026 0.343 0.232 | 0.382 0.069 0.032 | -0.598
06 | 5.147 | -1.197 0.466 0.054 | -3.900 7.225 0.574 | 0.562
07 | 1.276 | -0.356 0.041 0.078 | 0.353 0.059 0.077 | -0.613
08 | 2.915 | -2.607 2.211 0.800 | -0.709 0.239 0.059 | 0.376
09 | 4.097 | -0.631 0.130 0.024 | 2.969 4.187 0.525 | -1.999
10 | 3.138 | -1.926 1.206 0.376 | -1.711 1.390 0.297 | 1.034
ctr cos2
01 0.069 0.033 |
02 0.000 0.000 |
03 0.402 0.038 |
04 1.515 0.416 |
05 0.254 0.079 |
06 0.224 0.012 |
07 0.267 0.231 |
08 0.100 0.017 |
09 2.841 0.238 |
10 0.760 0.108 |
Variables
Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr
Aubry | 0.458 6.417 0.210 | -0.180 1.439 0.032 | -0.751 37.734
Bardella | -0.941 27.083 0.886 | -0.187 1.557 0.035 | 0.105 0.743
Bellamy | 0.379 4.397 0.144 | -0.343 5.237 0.117 | 0.637 27.137
Deffontaines | -0.279 2.384 0.078 | 0.773 26.707 0.598 | -0.132 1.172
Glucksman | 0.735 16.508 0.540 | 0.577 14.837 0.332 | 0.020 0.026
Hayer | 0.650 12.921 0.422 | -0.119 0.637 0.014 | 0.581 22.564
Lassale | -0.311 2.965 0.097 | 0.761 25.839 0.579 | 0.266 4.732
Marechal | -0.185 1.046 0.034 | -0.611 16.681 0.374 | 0.057 0.214
Toussaint | 0.925 26.178 0.856 | 0.057 0.146 0.003 | -0.129 1.105
Autres | 0.057 0.101 0.003 | -0.394 6.921 0.155 | -0.262 4.573
cos2
Aubry 0.565 |
Bardella 0.011 |
Bellamy 0.406 |
Deffontaines 0.018 |
Glucksman 0.000 |
Hayer 0.338 |
Lassale 0.071 |
Marechal 0.003 |
Toussaint 0.017 |
Autres 0.068 |
- Commentaires : A priori ils sont assez vosins de ceux déja vus pour les régions
- L’axe 1 résume … % de l’information et oppose les régons … aux régions …
- L’axe 2 résume … % de l’information et oppose les régons … aux régions …
On va cette fois-ci cartographier les axes factoriels afin de mieux comprendre les oppositions spatiales qu’ils mettent en évidence et pour situer les départements de notre région :
mapdon$axe1<-acp$ind$coord[,1]
mapdon$axe2<-acp$ind$coord[,2]
par(mfrow=c(1,2))
mypal<- brewer.pal(6, "RdYlBu")
mybreaks<-c(-10,-2,-1,0,1,2,10)
mf_map(mapdon, type="choro", var="axe1", pal=mypal, breaks=mybreaks, lwd=0.1, border="white")
mf_map(mapreg, type="base", col=NA, lwd=1, add=T)
mf_layout("Axe1 (33%): Ecolo+Bobos Vs Prolos+Fachos ?", frame=T)
mf_map(mapdon, type="choro", var="axe2",pal=mypal, breaks=mybreaks, lwd=0.1, border="white")
mf_map(mapreg, type="base", col=NA, lwd=1, add=T)
mf_layout("Axe2 (22%) : Gauche Vs Droite ?", frame=T)Classification ascendante hiérarchique
Vous allez ensuite classer les départements en choisissant le nombre de classes adapté (j’ai pris 4 mais on peut faire un choix différent)
cah<-HCPC(acp, nb.clust = 3, graph=F)
plot(cah,choice = "tree")catdes(cah$data.clust,num.var = 11)
Link between the cluster variable and the quantitative variables
================================================================
Eta2 P-value
Bardella 0.5971187 1.085317e-18
Toussaint 0.5868101 3.426205e-18
Lassale 0.5335313 8.539308e-16
Glucksman 0.5226421 2.440101e-15
Deffontaines 0.4185499 1.928936e-11
Hayer 0.3603235 1.483196e-09
Marechal 0.1478857 6.881012e-04
Aubry 0.1339412 1.440145e-03
Description of each cluster by quantitative variables
=====================================================
$`1`
v.test Mean in category Overall mean sd in category Overall sd
Bardella 6.976394 39.726945 33.884648 4.054609 7.4155479
Marechal 3.596471 5.686227 5.337026 0.932885 0.8597853
Lassale -1.988401 2.673761 3.079946 1.039553 1.8088826
Hayer -4.164846 12.961003 14.112831 1.396425 2.4489474
Toussaint -5.705205 3.891450 4.895653 0.817938 1.5586223
Glucksman -6.971136 11.081598 13.434096 1.736401 2.9882460
p.value
Bardella 3.028535e-12
Marechal 3.225641e-04
Lassale 4.676734e-02
Hayer 3.115632e-05
Toussaint 1.162031e-08
Glucksman 3.143924e-12
$`2`
v.test Mean in category Overall mean sd in category Overall sd
Lassale 6.911539 5.655660 3.079946 1.8822244 1.8088826
Deffontaines 6.132592 3.516519 2.529523 0.7656561 0.7811937
Glucksman 3.137765 15.365838 13.434096 1.8852301 2.9882460
Autres -2.234648 7.043583 7.320773 0.4512943 0.6020832
Marechal -2.464580 4.900464 5.337026 0.4063327 0.8597853
p.value
Lassale 4.794224e-12
Deffontaines 8.645878e-10
Glucksman 1.702416e-03
Autres 2.544049e-02
Marechal 1.371738e-02
$`3`
v.test Mean in category Overall mean sd in category Overall sd
Toussaint 7.290583 6.535799 4.895653 1.3155696 1.5586223
Hayer 5.769028 16.152039 14.112831 2.7410936 2.4489474
Glucksman 4.669887 15.448294 13.434096 2.5218415 2.9882460
Aubry 3.450912 10.507913 8.283339 6.5710953 4.4661535
Bellamy 2.345550 7.665869 7.122164 1.6174986 1.6059764
Deffontaines -3.287260 2.158866 2.529523 0.4916698 0.7811937
Lassale -3.766977 2.096427 3.079946 0.9632606 1.8088826
Bardella -6.570856 26.851584 33.884648 6.0192932 7.4155479
p.value
Toussaint 3.086155e-13
Hayer 7.973011e-09
Glucksman 3.013658e-06
Aubry 5.586960e-04
Bellamy 1.899904e-02
Deffontaines 1.011672e-03
Lassale 1.652365e-04
Bardella 5.002687e-11
- Commentaire : La classification met en évidence deux grands types de région.
- La classe 1 ( …)
- La classe 2 (…) .
- la classe 3 (…)
- …
On peut ensuite cartogaphier les classes correspondantes pour mieux voir la distribution spatiale. Cela suppose que l’on ait donné aux classes des noms suite à l’interprétation
mapdon$cah<-as.factor(cah$data.clust$clust)
levels(mapdon$cah)<-c("Classe 1 : Fachos ?",
"Classe 2 = Gauchos ?",
"Classe 3 = Bobos ")
par(mfrow=c(1,1))
mf_map(mapdon, type="typo", var="cah", lwd=0.1, border="white", leg_title = "Classes")
mf_map(mapreg, type="base", col=NA, lwd=1, add=T)
mf_layout("Typologie en trois classes aux noms ...discutables !", frame=T,credits = "")- Commentaire : Les différentes classes recouvrent souvent des départements voisins mais elles neforment pas des régions puisque chaque classe se compose de plusieurs blocs départementaux séparés. Seule la classe 1 forme presque une région d’un seul bloc.
C. REGIONALISATION A L’ECHELLE DEPARTEMENTALE
Nous reprenons l’analyse précédente mais avec une légère modification puisque nous allons maintenant cherche à construire des régions et non pas des classes. Les critères utilisés sont les mêmes (distance euclidienne standardisée) mais le regroupement ne pourra s’opérer qu’entre départements voisins i.e. ayant une frontière commune. Il y a beaucoup de méthodes possibles de régionalisation mais on se limitera ici à la méthode SKATER vue en cours.
Préparation des données
la préparation des données est la même que précédemment
### Fonds de carte région (pour habillage)
mapreg<-st_read("data/elect2024/map_reg.shp", quiet=T) %>%
st_transform(2154)
### Fonds de carte dept
map<-st_read("data/elect2024/map_dept.shp", quiet=T) %>%
select(code=code_dpt, geometry) %>%
st_transform(2154)
### Données
don<-readRDS("data/elect2024/don_dept.RDS") %>%
select(code=code_dpt, nom=nom_dpt, 5:14)
### Jointure
mapdon<-left_join(map[,1],don)Calcul du graphe de contiguïté
On utilise la procédure poly2nb() du package spdep :
# Table de voisinage
map_nb<-spdep::poly2nb(mapdon,row.names = mapdon$code)
# Table de poids
map_nb_w<-nb2listw(map_nb)
summary(map_nb_w)Characteristics of weights list object:
Neighbour list object:
Number of regions: 94
Number of nonzero links: 474
Percentage nonzero weights: 5.364418
Average number of links: 5.042553
Link number distribution:
2 3 4 5 6 7 8 10
6 12 14 19 30 11 1 1
6 least connected regions:
06 29 57 62 66 74 with 2 links
1 most connected region:
77 with 10 links
Weights style: W
Weights constants summary:
n nn S0 S1 S2
W 94 8836 94 40.29206 383.9874
# Carte de voisinage
coo<-st_coordinates(st_centroid(mapdon))
mf_map(mapdon, type="base",col="lightyellow")
mf_layout("Carte des liens de voisinage", frame=T)
plot.nb(map_nb,coords = coo,add = T,col = "red",points = F)
mf_label(mapdon, var="code", col="blue",cex=0.6,halo = T, bg="white",r = 0.1)- Commentaire : On vérifie que le graphe est connexe et que chaque département a au moins un voisin. Certains départements situes aux extrémités du pays ont un seul voisin (ex. O6 Alpes Maritime ou 09 Finistère) tandis que d’autres ont jusqu’à 10 voisins (77 : Seine-et-Marne). Leurs possibilités de regroupement en région seront donc plus ou moins contraintes.
Calcul de la matrice de dissimilarité
Nous devons calculer la matrice de dissimilarité directement à partir du tableau des variables standardisées.
# choix des variables
tab<-mapdon[,4:13] %>% st_drop_geometry()
row.names(tab)<- mapdon$code
# standardisation
tabstd <-scale(tab)
# calcul des distances
matdis <- as.matrix(dist(tabstd, method="euclidean"))
# Extrait de la matrice
kable(matdis[c("06","83","92","78"),c("06","83","92","78")], digits=2, caption="Extrait de la matrice de dissimilarité")| 06 | 83 | 92 | 78 | |
|---|---|---|---|---|
| 06 | 0.00 | 1.91 | 6.86 | 5.03 |
| 83 | 1.91 | 0.00 | 7.90 | 6.13 |
| 92 | 6.86 | 7.90 | 0.00 | 2.08 |
| 78 | 5.03 | 6.13 | 2.08 | 0.00 |
- Commentaire : Les Alpes Maritime (06) et le Var (83) ont des profils très proches (d = 1.91). Tout comme les Hauts-de-Seine (92) et les Yvelines (d= 2.08). Par contre les départements de chaque groupe sont très différents de ceux de l’autre groupe(d > 5), la plus forte différence étant observée ici entre les Hauts de Seine et le Var (d = 7.90)
Calcul de l’arbre couvrant minimal (minimum spanning tree)
On va ensuite utilise un algorithme pour déterminer l’arbre couvrant minimum, c’est-à-dire le graphe permettant de relier tous les départements les uns en l’autre en empruntant des chemins où les différences sont les plus faibles possibles.
map_nb<-poly2nb(mapdon)
lcosts <- nbcosts(map_nb,tabstd,method="euclidean",)
#summary(lcosts)
sim <- nb2listw(map_nb,lcosts,style="B")
#summary(sim)
mst <- mstree(sim)
class(mst)[1] "mst" "matrix"
size<-mst[,3]
size<-size/max(size)
mst[,3]<-0.5+4*size
y<-unlist(sim$neighbours)
w<-unlist(sim$weights)
x<-as.numeric(lapply(sim$neighbours, length))
n<-length(x)
xx<-NULL
for (i in 1:n) {
z<-rep(i,x[i])
xx<-c(xx,z)
}
q<-data.frame(xx,y,w)
ctr<-st_coordinates(st_centroid(mapdon))
mf_map(mapdon, type="base",col="lightyellow",lwd=0.2)
mf_map(mapreg, type="base", col=NA, lwd=1, add=T)
#segments(ctr[q[,1],1] ,ctr[q[,1],2], ctr[q[,2],1] ,ctr[q[,2],2],
# col="gray", lwd=1+2*q$w, lty=2)
segments(ctr[mst[,1],1] ,ctr[mst[,1],2], ctr[mst[,2],1] ,ctr[mst[,2],2],
col="red", lwd=mst[,3])
#points(x=(ctr[q[,1],1] +ctr[q[,2],1])/2, y=(ctr[q[,1],2] +ctr[q[,2],2])/2, pch=22, # bg="white", cex=3, col="black")
#text( x=(ctr[q[,1],1] +ctr[q[,2],1])/2, y=(ctr[q[,1],2] +ctr[q[,2],2])/2, #round(q$w,1), cex=0.7)
mf_label(mapdon, var="code", col="blue",cex=0.5,halo = T,bg = "white")
mf_layout("Arbre couvrant minimum du graphe de dissimilarité", frame=T)- Commentaire : Il est intéressant de voir que l’arbre couvrant minimum respecte plus ou moins bien les limites régionales. Certaines régions sont assez compactes tandis que d’autres sont plus écartelées. Qu’en est-il pour votre région ?
Régionalisation par la méthode SKATER
Cette méthode consiste à découper l’arbre couvrant minimal en plusieurs sous-arbres de façon à minimiser les différences intra-régionales et maximiser les différences inter-régionales. On ne sait pas a priori le nombre de régions qui sont nécessaire et on doit tatonner pour trouver le nombre de région permettant d’assurer un bon compromis entre efficacité (peu de régions rendent le résultat plus simple à interpréter) et homogénéité (beaucoup de régions permet d’assurer une plus grande homogénéité).
contig_w<-queen_weights(mapdon)
regio<-skater(6, contig_w, tab, scale_method = "standardize")
mapdon$regio<-as.factor(regio$Clusters)
don$regio<-as.factor(regio$Clusters)
mf_map(mapdon, type="typo",var="regio",leg_title = "Regionalisation", lwd=0.4, border="white")
mf_map(mapreg, type="base", col=NA, lwd=1, add=T)
segments(ctr[mst[,1],1] ,ctr[mst[,1],2], ctr[mst[,2],1] ,ctr[mst[,2],2],
col="red", lwd=mst[,3])
#mstk<-mst[c(2:5,7:10),]
#segments(ctr[mstk[,1],1] ,ctr[mstk[,1],2], ctr[mstk[,2],1] ,ctr[mstk[,2],2],
# col="red", lwd=1+2*mstk[,3])
#mf_label(mapdon, var="nom", col="black",cex=0.5,halo = T,bg = "white")
mf_layout("Régionalisation par la methode SKATER", frame=T)- Commentaire : Pour un nombre de classe donnée (ici on a choisi arbitrairement 6), la carte permet de voir à quel endroit on a découpé l’arbre couvrant minimum (ex. entre Hérault et Aude, entre Dordogne et Charentes, …). Puis ont peut examiner si une région administrative appartiennent à une seule région homogène (ex. Bourgogne-Franche Comté) ou à plusieurs (ex. Occitanie). On peut aussi trouver des cas ou une région administrative se sépare en deux régions homogènes qui lui sont propres comme dans le cas de l’Ile-de-France.
Par rapport à la classification, on remarque que beaucoup de départements métropolitains sont désormais fusionnés dans des ensembles plus vastes. Ainsi le Haut-Rhin (Strasbourg) se retrouve fusionnée avec la grande classe 1 caractérisée par le vote Bardella alors que son profil serait plutôt différent. Mais il n’y avaut aucune possibilité de regroupement avec des voisins similaires.
On oeut évaluer la qualité de la régionalisaiton en comparant la ressemblance moyenne de deux unités situes dans une même région et deux unités situées dans des régions différentes. Les résultats s’affichent comme suit
regio$Clusters
[1] 1 1 1 1 1 4 1 1 2 1 2 2 4 3 1 3 3 1 2 1 3 2 2 1 1 1 1 3 4 2 2 3 4 3 1 3 1 1
[39] 2 1 1 1 3 1 2 2 2 3 3 1 1 3 1 1 3 1 1 1 1 3 1 2 2 2 2 1 1 1 1 1 3 1 1 6 1 5
[77] 6 3 1 2 2 4 4 3 3 2 1 1 1 5 6 5 5 5
$`Total sum of squares`
[1] 930
$`Within-cluster sum of squares`
[1] 30.52610 41.26855 57.77769 70.48488 44.70927 37.88487 33.26559 42.98798
[9] 63.69268 74.08317
$`Total within-cluster sum of squares`
[1] 433.3192
$`The ratio of between to total sum of squares`
[1] 0.4659346
- Commentaire : les résultats nous indiquent que la régionalisation résume environ 47% de la variance totale du tableau de données ce qui est évidemment moins que ce que l’on aurait obtenu avec une classification sans contraintes de contiguïté en 6 classes.
Profil de vote des régions issues de SKATER
Comme dans une classification, on peut analyser le profil de vote des régions obtenues
tabstd<-as.data.frame(tabstd)
tabstd$regions<-as.factor(regio$Clusters)
catdes(tabstd,num.var = 11)
Link between the cluster variable and the quantitative variables
================================================================
Eta2 P-value
Aubry 0.6717624 6.606041e-20
Lassale 0.6423055 2.716194e-18
Hayer 0.5926358 7.380970e-16
Bardella 0.5562521 2.905184e-14
Marechal 0.5377637 1.667482e-13
Glucksman 0.5192552 8.921106e-13
Bellamy 0.3787345 4.518475e-08
Toussaint 0.3151325 2.542470e-06
Deffontaines 0.2420981 1.524734e-04
Autres 0.2034068 1.076642e-03
Description of each cluster by quantitative variables
=====================================================
$`1`
v.test Mean in category Overall mean sd in category Overall sd
Bardella 4.856376 0.5455056 1.699660e-17 0.7283134 0.9946666
Autres 2.571012 0.2887959 1.597422e-16 1.0750407 0.9946666
Aubry -1.995322 -0.2241300 -3.912355e-18 0.4505621 0.9946666
Lassale -2.071134 -0.2326457 -5.321357e-17 0.5184139 0.9946666
Toussaint -3.061320 -0.3438710 1.998623e-16 0.8940186 0.9946666
Glucksman -5.634212 -0.6328782 -2.402223e-16 0.6528249 0.9946666
p.value
Bardella 1.195536e-06
Autres 1.014019e-02
Aubry 4.600776e-02
Lassale 3.834629e-02
Toussaint 2.203638e-03
Glucksman 1.758601e-08
$`2`
v.test Mean in category Overall mean sd in category Overall sd
Lassale 7.154761 1.4661725 -5.321357e-17 0.9969633 0.9946666
Deffontaines 4.305462 0.8822865 -2.591382e-16 0.9603597 0.9946666
Glucksman 3.618697 0.7415528 -2.402223e-16 0.6752959 0.9946666
Autres -2.060698 -0.4222837 1.597422e-16 0.6296755 0.9946666
Hayer -2.827635 -0.5794463 1.139935e-16 0.6432678 0.9946666
Bellamy -3.127869 -0.6409711 2.218785e-16 0.7926806 0.9946666
p.value
Lassale 8.381854e-13
Deffontaines 1.666377e-05
Glucksman 2.960904e-04
Autres 3.933184e-02
Hayer 4.689329e-03
Bellamy 1.760786e-03
$`3`
v.test Mean in category Overall mean sd in category Overall sd
Hayer 6.107688 1.2944446 1.139935e-16 0.8588588 0.9946666
Glucksman 3.630919 0.7695258 -2.402223e-16 0.7456890 0.9946666
Toussaint 3.464445 0.7342438 1.998623e-16 0.8697713 0.9946666
Bardella -2.659573 -0.5636617 1.699660e-17 0.5241394 0.9946666
Marechal -3.550099 -0.7523970 -4.907791e-16 0.5509129 0.9946666
p.value
Hayer 1.010846e-09
Glucksman 2.824138e-04
Toussaint 5.313271e-04
Bardella 7.823979e-03
Marechal 3.850864e-04
$`4`
v.test Mean in category Overall mean sd in category Overall sd
Marechal 6.005817 2.3723232 -4.907791e-16 1.4186611 0.9946666
Hayer -2.188212 -0.8643529 1.139935e-16 0.3171995 0.9946666
p.value
Marechal 1.903712e-09
Hayer 2.865419e-02
$`5`
v.test Mean in category Overall mean sd in category Overall sd
Aubry 7.204488 3.1350842 -3.912355e-18 1.7868040 0.9946666
Autres 1.991475 0.8666046 1.597422e-16 0.8657687 0.9946666
Lassale -2.731904 -1.1888073 -5.321357e-17 0.1327097 0.9946666
Bardella -3.071960 -1.3367852 1.699660e-17 0.8308688 0.9946666
p.value
Aubry 5.826231e-13
Autres 4.642866e-02
Lassale 6.296956e-03
Bardella 2.126582e-03
$`6`
v.test Mean in category Overall mean sd in category Overall sd
Bellamy 4.738760 2.691912 2.218785e-16 0.4723836 0.9946666
Toussaint 3.396640 1.929504 1.998623e-16 1.2960162 0.9946666
Hayer 3.188246 1.811123 1.139935e-16 0.3056362 0.9946666
Aubry 2.648522 1.504526 -3.912355e-18 0.3961354 0.9946666
Glucksman 2.595190 1.474230 -2.402223e-16 1.2187502 0.9946666
Marechal 2.133428 1.211920 -4.907791e-16 0.4469218 0.9946666
Autres -2.248256 -1.277150 1.597422e-16 1.5834342 0.9946666
Deffontaines -2.341440 -1.330085 -2.591382e-16 0.1099219 0.9946666
Lassale -2.358849 -1.339974 -5.321357e-17 0.1345288 0.9946666
Bardella -4.676753 -2.656688 1.699660e-17 0.6622527 0.9946666
p.value
Bellamy 2.150304e-06
Toussaint 6.821870e-04
Hayer 1.431388e-03
Aubry 8.084470e-03
Glucksman 9.453863e-03
Marechal 3.288966e-02
Autres 2.455986e-02
Deffontaines 1.920949e-02
Lassale 1.833171e-02
Bardella 2.914534e-06
- Commentaire : La méthode SKATER met en évidence … régions ayant les caractéristiques suivantes
- La région 1 ( …)
- La région 2 (…) .
- la région 3 (…)
- …
D. ZOOM SUR UNE REGION : CLASSIFICATION
Nous allons finalement reprendre les analyses précédentes mais en nous limitant à une seule région et en passant à l’échelle plus détaillée des circonscriptions.Commençons par la classification
Préparation des données
### Fonds de carte
map<-st_read("data/elect2024/map_circ.shp", quiet=T) %>%
filter(nom_reg %in% myreg) %>%
select(code=ID, geometry) %>%
st_transform(2154)
### Données
don<-readRDS("data/elect2024/don_circ.RDS") %>%
filter(nom_reg %in% myreg) %>%
select(code=ID, nom=ID, 10:17,19,20)
### Jointure
mapdon<-left_join(map[,1],don)Cartographie rapide
Un coup d’oeil rapide sur la distribution des votes …
plot(mapdon[3:12])Analyse en composantes principales
On utilise la même procédure que pour les régions
tab<-mapdon[,3:12] %>% st_drop_geometry()
row.names(tab)<- mapdon$code
acp<-PCA(tab, scale.unit = T)summary(acp)
Call:
PCA(X = tab, scale.unit = T)
Eigenvalues
Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7
Variance 4.706 1.975 1.736 0.677 0.419 0.227 0.136
% of var. 47.063 19.754 17.359 6.772 4.188 2.270 1.356
Cumulative % of var. 47.063 66.817 84.175 90.947 95.135 97.405 98.761
Dim.8 Dim.9 Dim.10
Variance 0.083 0.041 0.000
% of var. 0.828 0.410 0.000
Cumulative % of var. 99.590 100.000 100.000
Individuals (the 10 first)
Dist Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3
09001 | 3.846 | 0.739 0.237 0.037 | 1.111 1.275 0.083 | -3.428
09002 | 2.653 | -0.704 0.215 0.070 | 0.763 0.602 0.083 | -2.044
11001 | 2.528 | -2.092 1.898 0.685 | 0.082 0.007 0.001 | -1.114
11002 | 2.498 | -2.320 2.334 0.863 | -0.384 0.152 0.024 | -0.118
11003 | 2.280 | -0.673 0.196 0.087 | 0.158 0.026 0.005 | -1.328
12001 | 4.743 | 1.128 0.552 0.057 | 1.815 3.403 0.146 | 4.138
12002 | 2.673 | 0.584 0.148 0.048 | 2.322 5.571 0.755 | 0.683
12003 | 3.187 | 0.523 0.119 0.027 | 2.549 6.710 0.640 | 1.350
34006 | 4.357 | -3.758 6.123 0.744 | -1.684 2.930 0.149 | 1.136
31002 | 3.555 | 3.347 4.859 0.887 | -0.774 0.618 0.047 | 0.731
ctr cos2
09001 13.815 0.794 |
09002 4.912 0.593 |
11001 1.460 0.194 |
11002 0.016 0.002 |
11003 2.072 0.339 |
12001 20.127 0.761 |
12002 0.548 0.065 |
12003 2.143 0.180 |
34006 1.518 0.068 |
31002 0.628 0.042 |
Variables
Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr
Aubry | 0.612 7.951 0.374 | -0.676 23.112 0.457 | -0.213 2.613
Bardella | -0.977 20.274 0.954 | -0.054 0.147 0.003 | -0.025 0.035
Bellamy | 0.446 4.222 0.199 | 0.214 2.314 0.046 | 0.798 36.723
Deffontaines | -0.417 3.687 0.174 | 0.429 9.312 0.184 | -0.489 13.748
Glucksman | 0.935 18.593 0.875 | 0.185 1.741 0.034 | -0.156 1.403
Hayer | 0.650 8.966 0.422 | 0.272 3.743 0.074 | 0.588 19.944
Lassale | -0.091 0.178 0.008 | 0.924 43.218 0.854 | 0.013 0.010
Marechal | -0.699 10.385 0.489 | -0.475 11.405 0.225 | 0.409 9.637
Toussaint | 0.934 18.531 0.872 | -0.268 3.623 0.072 | -0.110 0.702
Autres | 0.583 7.213 0.339 | 0.165 1.385 0.027 | -0.513 15.186
cos2
Aubry 0.045 |
Bardella 0.001 |
Bellamy 0.637 |
Deffontaines 0.239 |
Glucksman 0.024 |
Hayer 0.346 |
Lassale 0.000 |
Marechal 0.167 |
Toussaint 0.012 |
Autres 0.264 |
- Commentaires : Les axes sont ils différents de ceux vus pour la France entière par départements ?
- L’axe 1 résume … % de l’information et oppose les régons … aux régions …
- L’axe 2 résume … % de l’information et oppose les régons … aux régions …
Qeu montrent les cartes
mapdon$axe1<-acp$ind$coord[,1]
mapdon$axe2<-acp$ind$coord[,2]
par(mfrow=c(1,2))
mypal<- brewer.pal(6, "RdYlBu")
mybreaks<-c(-10,-2,-1,0,1,2,10)
mf_map(mapdon, type="choro", var="axe1", pal=mypal, breaks=mybreaks, lwd=0.1, border="white")
mf_map(mapreg, type="base", col=NA, lwd=1, add=T)
mf_layout("Axe1 (...%): Sigification ?", frame=T)
mf_map(mapdon, type="choro", var="axe2",pal=mypal, breaks=mybreaks, lwd=0.1, border="white")
mf_map(mapreg, type="base", col=NA, lwd=1, add=T)
mf_layout("Axe2 (..%) : Signification ?", frame=T)Classification ascendante hiérarchique
On applique ensuite une méthode de classification où vous devrez choisir le bon nombre de classes
cah<-HCPC(acp, nb.clust = 3, graph=F)
plot(cah,choice = "tree")catdes(cah$data.clust,num.var = 11)
Link between the cluster variable and the quantitative variables
================================================================
Eta2 P-value
Bardella 0.7635263 3.953724e-15
Toussaint 0.7559937 8.132471e-15
Glucksman 0.7279219 9.953003e-14
Lassale 0.7009854 8.728184e-13
Marechal 0.5105046 7.315055e-08
Aubry 0.5000834 1.187528e-07
Hayer 0.4077475 5.856781e-06
Bellamy 0.2244642 2.889636e-03
Autres 0.2118850 4.183704e-03
Deffontaines 0.2068348 4.845779e-03
Description of each cluster by quantitative variables
=====================================================
$`1`
v.test Mean in category Overall mean sd in category Overall sd
Bardella 5.165357 40.208105 33.202060 4.1690321 8.1381156
Marechal 4.947902 6.109378 5.500267 0.5431260 0.7386298
Autres -2.688677 6.770671 7.007183 0.5583550 0.5277966
Lassale -2.819601 2.839666 3.964720 1.2829173 2.3940711
Bellamy -3.212684 4.861061 5.489652 0.5917467 1.1739557
Toussaint -3.763994 3.989570 5.190898 0.9349410 1.9149785
Hayer -4.109525 10.927318 12.137259 0.8526189 1.7665413
Glucksman -5.349656 12.881743 15.607179 1.7289872 3.0567601
p.value
Bardella 2.399804e-07
Marechal 7.501762e-07
Autres 7.173574e-03
Lassale 4.808336e-03
Bellamy 1.315008e-03
Toussaint 1.672211e-04
Hayer 3.964738e-05
Glucksman 8.812178e-08
$`2`
v.test Mean in category Overall mean sd in category Overall sd
Lassale 5.669423 6.535707 3.964720 1.5700410 2.3940711
Aubry -2.927163 7.094251 9.218785 1.4671845 3.8317130
Marechal -3.377848 5.027670 5.500267 0.4389363 0.7386298
p.value
Lassale 1.432793e-08
Aubry 3.420701e-03
Marechal 7.305532e-04
$`3`
v.test Mean in category Overall mean sd in category Overall sd
Toussaint 5.877463 8.399128 5.190898 1.4098687 1.9149785
Aubry 4.754040 14.411178 9.218785 4.6440868 3.8317130
Glucksman 4.605575 19.620066 15.607179 1.5264840 3.0567601
Hayer 3.274420 13.786067 12.137259 1.2626467 1.7665413
Autres 2.720433 7.416459 7.007183 0.2434638 0.5277966
Bellamy 2.013699 6.163494 5.489652 0.6615278 1.1739557
Marechal -2.035031 5.071808 5.500267 0.5850698 0.7386298
Deffontaines -3.150424 2.066903 2.681996 0.1197292 0.6849521
Lassale -3.319331 1.699558 3.964720 0.7101750 2.3940711
Bardella -5.102650 21.365341 33.202060 4.9060553 8.1381156
p.value
Toussaint 4.166028e-09
Aubry 1.993912e-06
Glucksman 4.113275e-06
Hayer 1.058791e-03
Autres 6.519649e-03
Bellamy 4.404115e-02
Marechal 4.184780e-02
Deffontaines 1.630339e-03
Lassale 9.023326e-04
Bardella 3.349294e-07
- Commentaire : La classification met en évidence combien de types de région?
- La classe 1 ( …)
- La classe 2 (…) .
- la classe 3 (…)
- …
On peut ensuite cartogaphier les classes correspondantes pour mieux voir la distribution spatiale. Cela suppose que l’on ait donné aux classes des noms suite à l’interprétation
mapdon$cah<-as.factor(cah$data.clust$clust)
levels(mapdon$cah)<-c("Classe 1 : ????",
"Classe 2 = ????",
"Classe 3 = ???? ")
par(mfrow=c(1,1))
mf_map(mapdon, type="typo", var="cah", lwd=0.1, border="white", leg_title = "Classes")
mf_map(mapreg, type="base", col=NA, lwd=1, add=T)
mf_layout("Typologie en trois classes ...", frame=T,credits = "")- Commentaire : …
E. ZOOM SUR UNE REGION : REGIONALISATION
Nous reprenons la méthode utilisée pour la France par département, mais en l’appliquant aux circonscriptions de notre région
Préparation des données
la préparation des données est la même que précédemment
### Fonds de carte région (pour habillage)
mapdep<-st_read("data/elect2024/map_dept.shp", quiet=T) %>%
st_transform(2154)
### Fonds de carte
map<-st_read("data/elect2024/map_circ.shp", quiet=T) %>%
filter(nom_reg %in% myreg) %>%
select(code=ID, geometry) %>%
st_transform(2154)
### Données
don<-readRDS("data/elect2024/don_circ.RDS") %>%
filter(nom_reg %in% myreg) %>%
select(code=ID, nom=ID, 10:17,19,20)
### Jointure
mapdon<-left_join(map[,1],don)Calcul du graphe de contiguïté
On utilise la procédure poly2nb() du package spdep :
# Table de voisinage
map_nb<-spdep::poly2nb(mapdon,row.names = mapdon$code)
# Table de poids
map_nb_w<-nb2listw(map_nb)
summary(map_nb_w)Characteristics of weights list object:
Neighbour list object:
Number of regions: 49
Number of nonzero links: 236
Percentage nonzero weights: 9.829238
Average number of links: 4.816327
Link number distribution:
2 3 4 5 6 7 8
1 12 9 9 12 3 3
1 least connected region:
65002 with 2 links
3 most connected regions:
31006 34005 81003 with 8 links
Weights style: W
Weights constants summary:
n nn S0 S1 S2
W 49 2401 49 21.72266 200.6484
# Carte de voisinage
coo<-st_coordinates(st_centroid(mapdon))
mf_map(mapdon, type="base",col="lightyellow")
mf_layout("Carte des liens de voisinage", frame=T)
plot.nb(map_nb,coords = coo,add = T,col = "red",points = F)
mf_label(mapdon, var="code", col="blue",cex=0.6,halo = T, bg="white",r = 0.1)- Commentaire : On vérifie que le graphe est connexe et que chaque département a au moins un voisin. Certains départements situes aux extrémités du pays ont un seul voisin (ex. O6 Alpes Maritime ou 09 Finistère) tandis que d’autres ont jusqu’à 10 voisins (77 : Seine-et-Marne). Leurs possibilités de regroupement en région seront donc plus ou moins contraintes.
Calcul de la matrice de dissimilarité
Nous devons calculer la matrice de dissimilarité directement à partir du tableau des variables standardisées.
# choix des variables
tab<-mapdon[,3:12] %>% st_drop_geometry()
row.names(tab)<- mapdon$code
# standardisation
tabstd <-scale(tab)
# calcul des distances
matdis <- as.matrix(dist(tabstd, method="euclidean"))Calcul de l’arbre couvrant minimal (minimum spanning tree)
On va ensuite utilise un algorithme pour déterminer l’arbre couvrant minimum, c’est-à-dire le graphe permettant de relier tous les départements les uns en l’autre en empruntant des chemins où les différences sont les plus faibles possibles.
map_nb<-poly2nb(mapdon)
lcosts <- nbcosts(map_nb,tabstd,method="euclidean",)
#summary(lcosts)
sim <- nb2listw(map_nb,lcosts,style="B")
#summary(sim)
mst <- mstree(sim)
size<-mst[,3]
size<-size/max(size)
mst[,3]<-0.5+4*size
y<-unlist(sim$neighbours)
w<-unlist(sim$weights)
x<-as.numeric(lapply(sim$neighbours, length))
n<-length(x)
xx<-NULL
for (i in 1:n) {
z<-rep(i,x[i])
xx<-c(xx,z)
}
q<-data.frame(xx,y,w)
ctr<-st_coordinates(st_centroid(mapdon))
mf_map(mapdon, type="base",col="lightyellow",lwd=0.2)
mf_map(mapdep, type="base", col=NA, lwd=1, add=T)
#segments(ctr[q[,1],1] ,ctr[q[,1],2], ctr[q[,2],1] ,ctr[q[,2],2],
# col="gray", lwd=1+2*q$w, lty=2)
segments(ctr[mst[,1],1] ,ctr[mst[,1],2], ctr[mst[,2],1] ,ctr[mst[,2],2],
col="red", lwd=mst[,3])
#points(x=(ctr[q[,1],1] +ctr[q[,2],1])/2, y=(ctr[q[,1],2] +ctr[q[,2],2])/2, pch=22, # bg="white", cex=3, col="black")
#text( x=(ctr[q[,1],1] +ctr[q[,2],1])/2, y=(ctr[q[,1],2] +ctr[q[,2],2])/2, #round(q$w,1), cex=0.7)
mf_label(mapdon, var="code", col="blue",cex=0.5,halo = T,bg = "white")
mf_layout("Arbre couvrant minimum du graphe de dissimilarité", frame=T)- Commentaire : Que remarquez-vous ?
Régionalisation par la méthode SKATER
A vous de choisir le bon nombre de régions…
contig_w<-queen_weights(mapdon)
regio<-skater(6, contig_w, tab, scale_method = "standardize")
mapdon$regio<-as.factor(regio$Clusters)
don$regio<-as.factor(regio$Clusters)
mf_map(mapdon, type="typo",var="regio",leg_title = "Regionalisation", lwd=0.4, border="white")
mf_map(mapdep, type="base", col=NA, lwd=1, add=T)
segments(ctr[mst[,1],1] ,ctr[mst[,1],2], ctr[mst[,2],1] ,ctr[mst[,2],2],
col="red", lwd=mst[,3])
#mstk<-mst[c(2:5,7:10),]
#segments(ctr[mstk[,1],1] ,ctr[mstk[,1],2], ctr[mstk[,2],1] ,ctr[mstk[,2],2],
# col="red", lwd=1+2*mstk[,3])
#mf_label(mapdon, var="nom", col="black",cex=0.5,halo = T,bg = "white")
mf_layout("Régionalisation par la methode SKATER", frame=T)- Commentaire : Quelles différences avec la classification ?
regio$Clusters
[1] 2 2 1 1 2 3 3 3 1 4 4 1 1 4 1 1 6 6 2 4 2 2 4 2 2 1 1 1 3 3 3 2 2 1 1 1 1 4
[39] 3 2 3 2 2 4 1 5 5 1 1
$`Total sum of squares`
[1] 480
$`Within-cluster sum of squares`
[1] 22.05654 12.00617 17.29510 19.21094 12.59450 24.02348 10.53002 22.60925
[9] 11.66837 34.23028
$`Total within-cluster sum of squares`
[1] 293.7753
$`The ratio of between to total sum of squares`
[1] 0.612032
- Commentaire : Quelle est la qualité de la régionalisation ?
Profil de vote des régions issues de SKATER
tabstd<-as.data.frame(tabstd)
tabstd$regions<-as.factor(regio$Clusters)
catdes(tabstd,num.var = 11)
Link between the cluster variable and the quantitative variables
================================================================
Eta2 P-value
Lassale 0.7806245 3.927220e-13
Toussaint 0.7569089 3.416904e-12
Bardella 0.7498714 6.228452e-12
Glucksman 0.7376145 1.702063e-11
Bellamy 0.6396853 1.275197e-08
Deffontaines 0.5997722 1.115625e-07
Aubry 0.5404888 1.882237e-06
Marechal 0.5289739 3.110908e-06
Hayer 0.4995109 1.059797e-05
Autres 0.2868691 1.025983e-02
Description of each cluster by quantitative variables
=====================================================
$`1`
v.test Mean in category Overall mean sd in category Overall sd
Marechal 4.850801 0.9507492 -1.793138e-16 0.7205390 0.9897433
Bardella 4.218524 0.8268239 -2.492603e-16 0.6010402 0.9897433
Bellamy -2.493796 -0.4887801 2.987973e-16 0.4755723 0.9897433
Hayer -2.610644 -0.5116820 -3.089932e-16 0.5400064 0.9897433
Autres -2.852440 -0.5590736 -5.048222e-16 1.0658564 0.9897433
Toussaint -2.908375 -0.5700369 8.135499e-17 0.5714399 0.9897433
Lassale -3.485603 -0.6831725 4.814743e-17 0.3677431 0.9897433
Glucksman -4.550217 -0.8918352 7.448690e-17 0.5773489 0.9897433
p.value
Marechal 1.229636e-06
Bardella 2.459068e-05
Bellamy 1.263850e-02
Hayer 9.037196e-03
Autres 4.338504e-03
Toussaint 3.633119e-03
Lassale 4.910296e-04
Glucksman 5.359054e-06
$`2`
v.test Mean in category Overall mean sd in category Overall sd
Lassale 3.469376 0.8247701 4.814743e-17 0.6134112 0.9897433
Aubry -2.071237 -0.4923924 2.297270e-16 0.4231931 0.9897433
Bellamy -2.218756 -0.5274619 2.987973e-16 0.8023645 0.9897433
p.value
Lassale 0.0005216689
Aubry 0.0383366589
Bellamy 0.0265033208
$`3`
v.test Mean in category Overall mean sd in category Overall sd
Bellamy 4.469216 1.4453741 2.987973e-16 0.6311409 0.9897433
Lassale 3.875329 1.2533072 4.814743e-17 0.5744634 0.9897433
Hayer 2.598313 0.8403116 -3.089932e-16 0.9161303 0.9897433
Aubry -2.021208 -0.6536720 2.297270e-16 0.1781132 0.9897433
p.value
Bellamy 7.850671e-06
Lassale 1.064805e-04
Hayer 9.368302e-03
Aubry 4.325826e-02
$`4`
v.test Mean in category Overall mean sd in category Overall sd
Toussaint 5.270502 1.8442915 8.135499e-17 0.67928508 0.9897433
Glucksman 4.425772 1.5486975 7.448690e-17 0.15470495 0.9897433
Hayer 3.348557 1.1717509 -3.089932e-16 0.55050264 0.9897433
Aubry 3.196516 1.1185476 2.297270e-16 1.01281298 0.9897433
Autres 2.642443 0.9246623 -5.048222e-16 0.44958990 0.9897433
Bellamy 2.284201 0.7993039 2.987973e-16 0.37556096 0.9897433
Deffontaines -2.262611 -0.7917489 1.382822e-16 0.09093272 0.9897433
Lassale -2.403146 -0.8409261 4.814743e-17 0.29332084 0.9897433
Marechal -2.403756 -0.8411393 -1.793138e-16 0.36399037 0.9897433
Bardella -4.519790 -1.5815969 -2.492603e-16 0.50541886 0.9897433
p.value
Toussaint 1.360512e-07
Glucksman 9.609809e-06
Hayer 8.123351e-04
Aubry 1.390981e-03
Autres 8.231043e-03
Bellamy 2.235972e-02
Deffontaines 2.365968e-02
Lassale 1.625468e-02
Marechal 1.622761e-02
Bardella 6.190109e-06
$`5`
v.test Mean in category Overall mean sd in category Overall sd
Aubry 3.320684 2.299659 2.297270e-16 1.5647360 0.9897433
Toussaint 2.308076 1.598402 8.135499e-17 0.4633838 0.9897433
Bardella -2.072268 -1.435099 -2.492603e-16 0.5743849 0.9897433
p.value
Aubry 0.0008979727
Toussaint 0.0209948920
Bardella 0.0382404927
$`6`
v.test Mean in category Overall mean sd in category Overall sd
Deffontaines 4.719854 3.26862 1.382822e-16 0.2199139 0.9897433
p.value
Deffontaines 2.360139e-06
- Commentaire : La méthode SKATER met en évidence … régions ayant les caractéristiques suivantes
- La région 1 ( …)
- La région 2 (…) .
- la région 3 (…)
- …